gboolean return_val = TRUE;
GdkWindow *window;
XIEvent *ev;
- Display *dpy;
- dpy = GDK_DISPLAY_XDISPLAY (display);
device_manager = (GdkX11DeviceManagerXI2 *) translator;
cookie = &xevent->xcookie;
if (xevent->type != GenericEvent)
return gdk_x11_device_manager_xi2_translate_core_event (translator, display, event, xevent);
-
- if (!XGetEventData (dpy, cookie))
+ else if (cookie->extension != device_manager->opcode)
return FALSE;
- if (cookie->type != GenericEvent ||
- cookie->extension != device_manager->opcode)
- {
- XFreeEventData (dpy, cookie);
- return FALSE;
- }
-
ev = (XIEvent *) cookie->data;
window = get_event_window (translator, ev);
if (window && GDK_WINDOW_DESTROYED (window))
- {
- XFreeEventData (dpy, cookie);
- return FALSE;
- }
+ return FALSE;
if (ev->evtype == XI_Motion ||
ev->evtype == XI_ButtonRelease)
{
if (_gdk_x11_moveresize_handle_event (xevent))
- {
- XFreeEventData (dpy, cookie);
- return FALSE;
- }
+ return FALSE;
}
switch (ev->evtype)
event->any.type = GDK_NOTHING;
}
- XFreeEventData (dpy, cookie);
-
return return_val;
}
{
GdkEvent *event = gdk_event_new (GDK_NOTHING);
GList *list = event_source->translators;
- GdkFilterReturn result;
+ GdkFilterReturn result = GDK_FILTER_CONTINUE;
GdkWindow *filter_window;
+ Display *dpy;
+
+ dpy = GDK_DISPLAY_XDISPLAY (event_source->display);
+
+ /* Get cookie data here so it's available
+ * to every event translator and event filter.
+ */
+ if (xevent->type == GenericEvent)
+ XGetEventData (dpy, &xevent->xcookie);
filter_window = gdk_event_source_get_filter_window (event_source, xevent);
if (filter_window)
if (_gdk_default_filters)
{
/* Apply global filters */
-
result = gdk_event_apply_filters (xevent, event, NULL);
+ }
+
+ if (result == GDK_FILTER_CONTINUE &&
+ filter_window && filter_window->filters)
+ {
+ /* Apply per-window filters */
+ result = gdk_event_apply_filters (xevent, event, filter_window);
+ }
+
+ if (result != GDK_FILTER_CONTINUE)
+ {
+ if (xevent->type == GenericEvent)
+ XFreeEventData (dpy, &xevent->xcookie);
if (result == GDK_FILTER_REMOVE)
{
gdk_event_free (event);
return NULL;
}
- else if (result == GDK_FILTER_TRANSLATE)
+ else /* GDK_FILTER_TRANSLATE */
return event;
}
- if (filter_window)
- {
- /* Apply per-window filters */
- GdkFilterReturn result;
-
- if (filter_window->filters)
- {
- result = gdk_event_apply_filters (xevent, event,
- filter_window);
-
- if (result == GDK_FILTER_REMOVE)
- {
- gdk_event_free (event);
- return NULL;
- }
- else if (result == GDK_FILTER_TRANSLATE)
- return event;
- }
- }
-
gdk_event_free (event);
event = NULL;
handle_focus_change (&event->crossing);
}
+ if (xevent->type == GenericEvent)
+ XFreeEventData (dpy, &xevent->xcookie);
+
return event;
}